﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AmCharts.Windows;
using System.Windows.Forms.DataVisualization.Charting;
using System.IO;

namespace MundoDigital
{
    public partial class frmPrincipal : Form
    {
        #region Propriedades

        int alturaImagem;
        int larguraImagem;
        clsImagem imagem;
        Bitmap btmap;
        bool CarregouHistogramas = false;

        bool _selecting;
        Rectangle _selection;

        #endregion

        #region Construtores

        public frmPrincipal()
        {
            InitializeComponent();

            tabEspelhada.Visible = false;
            tabImagemDeslocada.Visible = false;
            tabHistogramas.Visible = false;
            tabInfImagem.Visible = false;
            tabImagemModificada.Visible = false;
            tabImagemModifcada2.Visible = false;
            tabImagemRotacionada.Visible = false;
            tabImagemRedimensionada.Visible = false;
        }

        #endregion

        #region Botões: Abrir Imagem; Histogramas; Salvar Imagem

        private void btnAbrir_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            openFileDialogImagem.Filter = "Arquivos de Imagens |*.jpg;*.png;*bmp";
            openFileDialogImagem.ShowDialog();
            if (!string.IsNullOrEmpty(openFileDialogImagem.FileName))
            {
                btmap = new Bitmap(openFileDialogImagem.FileName);

                pcbImagem.Image = btmap;
                pcbImagem.Show();

                pcbEspelho.Image = btmap;
                pcbEspelho.Refresh();
                pcbEspelho.Show();

                pcbDeslocada.Image = btmap;
                pcbDeslocada.Refresh();
                pcbDeslocada.Show();

                pcbRotacionar.Image = btmap;
                pcbRotacionar.Refresh();
                pcbRotacionar.Show();

                pcbRedimensionada.Image = btmap;
                pcbRedimensionada.Refresh();
                pcbRedimensionada.Show();
            }
        }

        private void btnHistograma_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            if (btmap != null)
            {
                imagem = new clsImagem(btmap);

                if (imagem != null)
                {
                    CarregaInfImagem();

                    for (int i = 0; i <= 255; i++)
                    {
                        Series serOriginal = new Series();
                        Series serSuperior = new Series();
                        Series serInferior = new Series();
                        Series serEsquerda = new Series();
                        Series serDireita = new Series();

                        DataPoint dt = new DataPoint();

                        dt.AxisLabel = i.ToString();

                        dt.SetValueXY(Convert.ToDouble(i), Convert.ToDouble(imagem.HistogramaImagemOriginal[i]));
                        serDireita.Points.Add(dt);


                        serOriginal.Points.AddXY(Convert.ToDouble(i), Convert.ToDouble(imagem.HistogramaImagemOriginal[i]));
                        serSuperior.Points.AddXY(Convert.ToDouble(i), Convert.ToDouble(imagem.HistogramaMetadeSuperior[i]));
                        serInferior.Points.AddXY(Convert.ToDouble(i), Convert.ToDouble(imagem.HistogramaMetadeInferior[i]));
                        serEsquerda.Points.AddXY(Convert.ToDouble(i), Convert.ToDouble(imagem.HistogramaMetadeEsquerda[i]));
                        //serDireita.Points.AddXY(Convert.ToDouble(i),Convert.ToDouble(imagem.HistogramaMetadeDireita[i]));

                        if (i % 2 == 0)
                        {
                            serOriginal.Color = Color.Blue;
                            serSuperior.Color = Color.Blue;
                            serInferior.Color = Color.Blue;
                            serEsquerda.Color = Color.Blue;
                            serDireita.Color = Color.Blue;
                        }
                        else
                        {
                            serOriginal.Color = Color.Red;
                            serSuperior.Color = Color.Red;
                            serInferior.Color = Color.Red;
                            serEsquerda.Color = Color.Red;
                            serDireita.Color = Color.Red;
                        }

                        grfImagemOriginal.Series.Add(serOriginal);
                        grfMetadeSuperior.Series.Add(serSuperior);
                        grfMetadeInferior.Series.Add(serInferior);
                        grfMetadeEsquerda.Series.Add(serEsquerda);
                        grfMetadeDireita.Series.Add(serDireita);
                    }

                    grfImagemOriginal.Legends.Clear();
                    grfMetadeSuperior.Legends.Clear();
                    grfMetadeInferior.Legends.Clear();
                    grfMetadeEsquerda.Legends.Clear();
                    grfMetadeDireita.Legends.Clear();
                }

                tabHistogramas.Visible = true;
                tabInfImagem.Visible = true;

                CarregouHistogramas = true;
            }
            else
            {
                MessageBox.Show("Abra uma imagem para carregar os Histogramas.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Diversos

        private void CarregaInfImagem()
        {
            txtMedianaOriginal.Text = imagem.MedianaImagemOriginal.ToString();
            txtMediaOriginal.Text = imagem.MediaImagemOriginal.ToString();
            txtModaOriginal.Text = imagem.ModaImagemOriginal.ToString();
            txtVarianciaOriginal.Text = imagem.VarianciaImagemOriginal.ToString();

            txtMedianaSuperior.Text = imagem.MedianaMetadeSuperior.ToString();
            txtMediaSuperior.Text = imagem.MediaMetadeSuperior.ToString();
            txtModaSuperior.Text = imagem.ModaMetadeSuperior.ToString();
            txtVarianciaSuperior.Text = imagem.VarianciaMetadeSuperior.ToString();

            txtMedianaInferior.Text = imagem.MedianaMetadeInferior.ToString();
            txtMediaInferior.Text = imagem.MediaMetadeInferior.ToString();
            txtModaInferior.Text = imagem.ModaMetadeInferior.ToString();
            txtVarianciaInferior.Text = imagem.VarianciaMetadeInferior.ToString();

            txtMedianaEsquerda.Text = imagem.MedianaMetadeEsquerda.ToString();
            txtMediaEsquerda.Text = imagem.MediaMetadeEsquerda.ToString();
            txtModaEsquerda.Text = imagem.ModaMetadeEsquerda.ToString();
            txtVarianciaEsquerda.Text = imagem.VarianciaMetadeEsquerda.ToString();

            txtMedianaDireita.Text = imagem.MedianaMetadeDireita.ToString();
            txtMediaDireita.Text = imagem.MediaMetadeDireita.ToString();
            txtModaDireita.Text = imagem.ModaMetadeDireita.ToString();
            txtVarianciaDireita.Text = imagem.VarianciaMetadeDireita.ToString();
        }

        #endregion

        private void btnModificarImagem_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            if(btmap != null)
            {
                if (CarregouHistogramas)
                {
                    imagem.EditaImagem(imagem.BtmImagem, imagem);
                    pcbImaA.Image = imagem.bp1;
                    pcbImaA.Show();
                    pcbImaB.Image = imagem.bp2;
                    pcbImaB.Show();
                    pcbImaC.Image = imagem.bp3;
                    pcbImaC.Show();
                    pcbImaD.Image = imagem.bp4;
                    pcbImaD.Show();
                    pcbImaE.Image = imagem.bp5;
                    pcbImaE.Show();
                    pcbImaA1.Image = imagem.bp6;
                    pcbImaA1.Show();
                    pcbImaA2.Image = imagem.bp7;
                    pcbImaA2.Show();
                    pcbImaA3.Image = imagem.bp8;
                    pcbImaA3.Show();
                    pcbImaA4.Image = imagem.bp9;
                    pcbImaA4.Show();
                    pcbImaA5.Image = imagem.bp10;
                    pcbImaA5.Show();

                    tabImagemModificada.Visible = true;
                    tabImagemModifcada2.Visible = true;
                }
                else                
                    MessageBox.Show("Carregue os histogramas antes de editar a imagem.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);

            }
            else
            {
                MessageBox.Show("Abra uma imagem para editar.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void btnEspelhar_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            if(btmap != null)
            {

            pcbEspelho.Image = clsImagem.EspelhaIMagem((Bitmap)pcbEspelho.Image);
            pcbEspelho.Refresh();
            pcbEspelho.Show();
            tabEspelhada.Visible = true;
            tabPrincipal.SelectedTab = tabEspelhada;
            }
            else
            {
                MessageBox.Show("Abra uma imagem para espelhar.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void btnAplicarDeslocamento_Click(object sender, EventArgs e)
        {
            pcbDeslocada.Image = clsImagem.DeslocaIMagem(btmap, Convert.ToInt32(txtCima.Text), Convert.ToInt32(txtLado.Text));
            pcbDeslocada.Show();
        }

        private void btnDeslocada_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            if(btmap != null)
            {
            tabImagemDeslocada.Visible = true;
          
            tabPrincipal.SelectedTab = tabImagemDeslocada;
            txtCima.Select();
            }
            else
            {
                MessageBox.Show("Abra uma imagem para gerar o deslocamento.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void btnLimparDeslocamento_Click(object sender, EventArgs e)
        {
           
            pcbDeslocada.Image = btmap;
            txtCima.Text = "";
            txtLado.Text = "";
            pcbDeslocada.Show();
            txtCima.Select();
        }

        private void btnSalvar_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            if(btmap != null)
            {
            saveFileDialog1.Filter = "*.jpg | *.bmp";
            saveFileDialog1.FileName = "imagem 1";
            saveFileDialog1.ShowDialog();
            switch (tabPrincipal.SelectedTabIndex)
            {
                case 0:
                    
                    pcbImagem.Image.Save(saveFileDialog1.FileName);                     
                    break;
                case 5:
                    pcbEspelho.Image.Save(saveFileDialog1.FileName);
                    break;
                case 6:
                    pcbDeslocada.Image.Save(saveFileDialog1.FileName);
                    break;
                case 7:
                    pcbRotacionar.Image.Save(saveFileDialog1.FileName);
                    break;
                case 8:
                    pcbRedimensionada.Image.Save(saveFileDialog1.FileName);
                    break;
            }
            }
            else
            {
                MessageBox.Show("Não existe nenhuma imagem para salvar.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void btnRotacionar_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            if(btmap != null)
            {
            tabImagemRotacionada.Visible = true;
            tabPrincipal.SelectedTab = tabImagemRotacionada;
            }
            else
            {
                MessageBox.Show("Abra uma imagem para carregar os girar.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void sldRotacao_Click(object sender, EventArgs e)
        {
            txtRotacao.Text = sldRotacao.Value.ToString();
            pcbRotacionar.Image = clsImagem.GiraImagem(btmap, float.Parse(txtRotacao.Text)); ;
            pcbRotacionar.Show();
        }

        private void btnAplicarRotacao_Click(object sender, EventArgs e)
        {
            pcbRotacionar.Image = clsImagem.GiraImagem(btmap, float.Parse(txtRotacao.Text)); ;
            pcbRotacionar.Show();
        }

        private void btnLimparRotacao_Click(object sender, EventArgs e)
        {
            txtRotacao.Text = "";
            sldRotacao.Value = 0;
            pcbRotacionar.Image = btmap;
            pcbRotacionar.Show();
        }

        private void txtRotacao_Leave(object sender, EventArgs e)
        {
            pcbRotacionar.Image = clsImagem.GiraImagem(btmap, float.Parse(txtRotacao.Text)); ;
            pcbRotacionar.Show();
        }

        private void btnRedimensionar_Click(object sender, DevComponents.DotNetBar.ClickEventArgs e)
        {
            if(btmap != null)
            {
            tabImagemRedimensionada.Visible = true;
            tabPrincipal.SelectedTab = tabImagemRedimensionada;
            txtTamanho.Text = sldTamanho.Value.ToString();
            }
            else
            {
                MessageBox.Show("Abra uma imagem para redimensionar.", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void sldTamanho_Click(object sender, EventArgs e)
        {
            txtTamanho.Text = sldTamanho.Value.ToString();
            double aux = Convert.ToDouble(txtTamanho.Text) / 100;
            pcbRedimensionada.Image = clsImagem.RedimensionaImagem(btmap, float.Parse(aux.ToString("N2"))); ;
            pcbRedimensionada.Show();
        }

        private void txtTamanho_Leave(object sender, EventArgs e)
        {
            double aux = Convert.ToDouble(txtTamanho.Text) / 100;
            pcbRedimensionada.Image = clsImagem.RedimensionaImagem(btmap, float.Parse(aux.ToString("N2")));
            pcbRedimensionada.Show();
        }

        #region Balaca da seleção com o Mouse

        private void pcbRedimensionada_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                _selecting = true;
                _selection = new Rectangle(new Point(e.X, e.Y), new Size());
            }
        }

        private void pcbRedimensionada_MouseMove(object sender, MouseEventArgs e)
        {
            if (_selecting)
            {
                _selection.Width = e.X - _selection.X;
                _selection.Height = e.Y - _selection.Y;

                // Redraw the picturebox:
                pcbRedimensionada.Refresh();
            }
        }

        private void pcbRedimensionada_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && _selecting && _selection.Size != new Size())
            {
                // Create cropped image:
                Bitmap imag = clsImagem.Crop((Bitmap)pcbRedimensionada.Image, _selection);

                // Fit image to the picturebox:
               pcbRedimensionada.Image = clsImagem.Fit2PictureBox(imag, pcbRedimensionada);

                _selecting = false;
            }
            else
                _selecting = false;
        }

        private void pcbRedimensionada_Paint(object sender, PaintEventArgs e)
        {
            if (_selecting)
            {
                Pen pen = Pens.GreenYellow;
                e.Graphics.DrawRectangle(pen, _selection);
            }
        }

        #endregion

        private void btnLimparSel_Click(object sender, EventArgs e)
        {
            if (btmap != null)
            {
                double aux = Convert.ToDouble(100) / 100;
                txtTamanho.Text = "100";
                sldTamanho.Value = 100;
                pcbRedimensionada.Image = null;
                pcbRedimensionada.Image =  clsImagem.RedimensionaImagem(btmap, float.Parse(aux.ToString("N2")));
                
                pcbRedimensionada.Show();
            }
        }

    }
}
